package controller

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"

	"doctor_api_backend/config"
	"doctor_api_backend/models"
	"doctor_api_backend/utils"
)

// RegisterUser 用户注册
// 功能：
// 1. 验证请求数据
// 2. 创建新用户
// 3. 生成JWT令牌
// 4. 返回用户信息和令牌，注册用户必须要邮箱或者电话

// 修复这个登录注册的bug
func RegisterUser(c *gin.Context) {
	var newUser models.SystemUser
	if err := c.ShouldBindJSON(&newUser); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 加密密码
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(newUser.Password), bcrypt.DefaultCost)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	newUser.Password = string(hashedPassword)

	// 创建用户 注册用户必须要邮箱或者电话
	if newUser.Phone == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "注册用户必须要电话"})
		return
	}
	result := config.DB.Create(&newUser)
	if result.Error != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": result.Error.Error()})
		return
	}

	// 生成jwt token
	token, err := utils.GenerateToken(newUser.ID)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 返回token
	c.SetCookie("token", token, 3600, "/", "", false, true)

	c.JSON(http.StatusCreated, gin.H{"message": "注册用户成功", "token": token})
}

// LoginUser 用户登录
// 功能：
// 1. 验证请求数据
// 2. 验证用户凭据
// 3. 生成JWT令牌
// 4. 返回用户信息和令牌，登录用户必须要邮箱或者电话
func LoginUser(c *gin.Context) {
	var login models.SystemUser
	if err := c.ShouldBindJSON(&login); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 查找用户 登录用户必须要邮箱或者电话
	if login.Phone == "" {
		c.JSON(http.StatusBadRequest, gin.H{"error": "登录用户必须要电话"})
		return
	}
	var user models.SystemUser
	result := config.DB.Where("username = ?", login.Username).First(&user)
	if result.Error != nil {
		if result.Error == gorm.ErrRecordNotFound {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
			return
		}
		c.JSON(http.StatusInternalServerError, gin.H{"error": result.Error.Error()})
		return
	}

	// 验证密码
	if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(login.Password)); err != nil {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
		return
	}

	// 生成jwt token
	token, err := utils.GenerateToken(user.ID)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	// 返回token
	c.SetCookie("token", token, 3600, "/", "", false, true)

	c.JSON(http.StatusOK, gin.H{"message": "登录成功", "token": token})
}

// 退出登录
func LogoutUser(c *gin.Context) {
	c.SetCookie("token", "", -1, "/", "", false, true)
	c.JSON(http.StatusOK, gin.H{"message": "退出登录成功"})
}

// 调试指南：
// 1. 注册接口测试：
//    curl -X POST http://localhost:8080/api/v1/register \
//         -H "Content-Type: application/json" \
//         -d '{"username":"test","password":"123456","email":"test@example.com"}'
//
// 2. 登录接口测试：
//    curl -X POST http://localhost:8080/api/v1/login \
//         -H "Content-Type: application/json" \
//         -d '{"username":"test","password":"123456"}'
//
// 3. 常见问题排查：
//    - 参数验证失败：检查请求体格式和字段验证规则
//    - 用户创建失败：检查数据库连接和唯一约束
//    - 令牌生成失败：检查JWT配置和密钥
//    - 密码验证失败：检查密码加密和验证逻辑
